package com.wx.tgp.socket.demo.stream;

import java.io.*;

/**
 * 使用inputStream和outputStream 实现文件的复制
 */
public class OutputStreamDemo {
    public static void main(String[] args) {
        FileInputStream fis = null;
        BufferedInputStream bin = null;
        InputStreamReader isr = null;

        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        OutputStreamWriter osw = null;
        try {
            fis = new FileInputStream("c:/demo.txt");
            fos = new FileOutputStream("c:/text.txt");
            bin = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);
            isr = new InputStreamReader(bin,"UTF-8");
            osw = new OutputStreamWriter(bos,"UTF-8");
            StringBuffer sb = new StringBuffer();
            int c = 0;
//            while(true) {
//                int count = fis.available();  // 获取到可以读取多少个字节
//                if(count>0){
                if(isr.ready()) {     // 如果count>0，那么可以一次读取这么多字节
//                    byte[] input = new byte[count];
//                    char[] input = new char[count];
//                    bin.read(input);   // 把读取到的字符存放到byte[]数组中
                    while((c=isr.read())!=-1){
                        sb.append((char)c);
                    }
//                    isr.read(input); // 把读取到的字符存放到char[]数组中
                    // 把读取到的字节进行输出
//                    bos.write(input);   // 把byte[]数组进行写入到文件
//                    osw.write(input);     // 把char[]数组进行写入到文件
                    osw.write(sb.toString());
//                }else {
//                    break;
//                }
            }
            //必须要用flush方法。
            // 因为如果不用flush方法是当缓冲区满了之后才进行输出操作
            // 如果不用flush方法。有可能当缓冲区没有满而文件已经读取完毕的情况。
            // 就有可能
//            bos.flush();
            osw.flush();
            System.out.println("文件复制成功");
        } catch (Exception e) {
            // TODO: handle exception
            if(fis!=null){
                try{
                    fis.close();
                    bin.close();
                    fos.close();
                    bos.flush();
                    isr.close();
                    osw.close();
                }catch (IOException e1){
                }
            }
        } finally {
            // 在最后把IO流关闭
            if(fis!=null){
                try{
                    fis.close();
                    bin.close();
                    fos.close();
                    bos.flush();
                    isr.close();
                    osw.close();
                }catch (IOException e1){
                }
            }
        }
    }
}
